' Polygons_map.bas
#COMPILE EXE
#DIM ALL
#DEBUG ERROR ON
'
#TOOLS OFF
'
' include the common display library
#INCLUDE "win32api.inc"
#INCLUDE "..\Libraries\CommonDisplay.inc"
'
TYPE PolyPoint
  x AS SINGLE
  y AS SINGLE
END TYPE
'
TYPE PolyArray
  count AS LONG
  xy(1 TO 4) AS PolyPoint
END TYPE
'
%MaxX = 15
%MaxY = 15
'
FUNCTION PBMAIN () AS LONG
' the main PB function that is the first to be executed
  funPrepOutput("Polygons",0,0,40,120)
  '
  funLog("Polygons")
  '
  LOCAL hWin AS DWORD
  ' create the graphics window
  GRAPHIC WINDOW "Polygons", 300,300,680,580 TO hWin
  GRAPHIC ATTACH hWin,0 , REDRAW
  '
  funDrawPolygons()
  '
  funWait()
  '
END FUNCTION
'
FUNCTION funDrawPolygons() AS LONG
' draw the polygons on the graphics page
  LOCAL lngR , lngC, lngH AS LONG
  LOCAL udtPolygon AS PolyArray
  LOCAL lngCorner AS LONG
  '
  LOCAL lngXStart, lngYStart AS LONG
  LOCAL lngSize, lngHOffset, lngVOffset AS LONG
  LOCAL lngSea AS LONG
  '
  RANDOMIZE TIMER
  '
  lngXStart = 250
  lngYStart = 50
  lngSize   = 25
  lngHOffset = 15
  '
  RANDOMIZE TIMER
  '
  ' work out which vertex has height
  DIM a_lngHeight(%MaxX+1,%MaxX+1) AS LONG
  funDetermine_Terrain(a_lngHeight())
  '
  udtPolygon.count = 4
  FOR lngC = 1 TO %MaxY
    lngYStart = lngYstart + 25
    lngXStart = lngXStart - (lngHOffset + 1)
    '
    FOR lngR = 1 TO %MaxX
      lngSea = %TRUE
      ' set the coords of each corner of the polygon
      ' and its horizontal and vertical offsets
      lngVOffset = a_lngHeight(lngC,lngR)
      IF lngVOffset > 0 THEN lngSea = %FALSE
      udtPolygon.xy(1).x = lngXStart + (lngR * 25)
      udtPolygon.xy(1).y = lngYStart - lngVOffset
      '
      lngVOffset = a_lngHeight(lngC,lngR+1)
      IF lngVOffset > 0 THEN lngSea = %FALSE
      udtPolygon.xy(2).x = lngXStart + lngSize + (lngR * 25)
      udtPolygon.xy(2).y = lngYStart - lngVOffset
      '
      lngVOffset = a_lngHeight(lngC+1,lngR+1)
      IF lngVOffset > 0 THEN lngSea = %FALSE
      udtPolygon.xy(3).x = lngXStart + lngSize + (lngR * 25) - lngHOffset
      udtPolygon.xy(3).y = lngYStart + lngSize - lngVOffset
      '
      lngVOffset = a_lngHeight(lngC+1,lngR)
      IF lngVOffset > 0 THEN lngSea = %FALSE
      udtPolygon.xy(4).x = lngXStart + (lngR * 25) - lngHOffset
      udtPolygon.xy(4).y = lngYStart + lngSize - lngVOffset
      '
      IF ISTRUE lngSea THEN
      ' all 4 corners of the polygon have a zero vertical offset
        GRAPHIC POLYGON udtPolygon,%BLACK,%RGB_DEEPSKYBLUE,0
      ELSE
        GRAPHIC POLYGON udtPolygon,%BLACK,%RGB_LIMEGREEN,0
      END IF
      '
    NEXT lngR
  NEXT lngC
  GRAPHIC REDRAW
  '
END FUNCTION
'
FUNCTION funDetermine_Terrain(BYREF a_lngHeight() AS LONG) AS LONG
  ' work out which vertex has height
  LOCAL lngR , lngC AS LONG
  LOCAL lngVOffset AS LONG
  lngVOffset = 20
  '
  FOR lngC = 1 TO %MaxY
    FOR lngR = 1 TO %MaxX
    ' establish the height of this location
      IF funVOffset() = 1 THEN
      ' set the height
        a_lngHeight(lngC,lngR) = lngVOffset
      ELSE
        a_lngHeight(lngC,lngR) = 0
      END IF
    NEXT lngR
  NEXT lngC
  '
END FUNCTION
'
FUNCTION funVOffset() AS LONG
' determine probabilty that this location
' is at or above sea level
  LOCAL lngHeight AS LONG
  '
  lngHeight = RND(1,6)
  SELECT CASE lngHeight
    CASE 1,2
      FUNCTION = 1
    CASE ELSE
      FUNCTION = 0
  END SELECT
END FUNCTION